//
// Created by kenny on 25-11-10.
//

#ifndef MCP_MEDIA_H
#define MCP_MEDIA_H
#include "mcp_udp.h"
#include "../bm/sys_inc.h"
#include "../rtp/ps.h"

/*typedef struct ua_media_session_info
{
    int     ua_m_fd;
    int     ua_m_fd_talk;                   //上行连接 fd
    unsigned int	conn_addr;				//一般应该=0，某些SDP里面在m=audio/video后面还有这个
    unsigned short	remote_port;			//对应ua宣称的媒体端口
    unsigned short	local_port;				//媒体代理时服务器对该用户分配的端口
    unsigned int	local_ip;				//自己的IP地址，可能不是本机
    unsigned int	mux_id;					// 端口复用ID，如果=0为无效
    int     mux_fd;                         // 复用接收/发送socket文件
    unsigned int	rx_pkt_cnt;				//统计收到的媒体包个数
    unsigned int	tx_pkt_cnt;
    unsigned int	last_pkt_time;
} UA_MEDIA;*/

typedef struct
{
    uint8 *     buff;
    uint8 *     data;
    int         size;
    int			nbsamples;
    int         waitnext;
} UA_PACKET;

typedef struct
{
    int             vcodec;             // video codec
    int             width;              // video width
    int             height;             // video height
    int             framerate;          // video frame rate
    int             acodec;             // audio codec
    int             samplerate;         // audio sample rate
    int             channels;           // audio channels
    uint8_t         v_index;            // video stream index
    uint8_t         a_index;            // audio stream index

//    HQUEUE *        v_queue;            // video queue
//    HQUEUE *        a_queue;            // audio queue
//    pthread_t       v_thread;           // video thread
//    pthread_t       a_thread;           // audio thread

#ifdef GB_FILE
    CFileDemux *    file_demuxer;       // file demuxer object
#endif

#ifdef GB_LIVE
    CLiveVideo *    live_video;         // live video object
    CLiveAudio *    live_audio;         // live audio object
#endif
    int            is_exit_flag ;  //是否退出服务标识

} MEDIA_INFO;

typedef struct play_context
{
    uint32	b_pausing		: 1;	    // 播放暂停
    uint32	b_backing		: 1;	    // 正在快退
    uint32	b_seek_req		: 1;	    // 客户端请求重新定位
    uint32	b_seek_finish	: 1;	    // 重新定位完成
    uint32	b_scale_req		: 1;	    // 客户端请求快进/慢进
    uint32	b_scale_finish	: 1;	    // 快进/慢进完成
    uint32	b_step_req		: 1;	    // 客户端请求单步进或退
    uint32	b_step_finish	: 1;	    // 单步进或退完成
    uint32	b_resvd			: 24;

    long    seek_pos;				    // 要求重新定位偏移量
    float   scale;					    // 文件播放快进/慢进倍数
    int     step;					    // 单步前进或后退
} PLAYCTX;

typedef struct sdp_info
{
    uint32	is_valid	: 1;	// 有效标识
    uint32	mtype		: 2;
    uint32	sendrecv	: 2;	// a=sendonly, a=recvonly, a=sendrecv
    uint32	rtp_tcp		: 1;	// RTP/AVP; RTP/AVP/TCP
    uint32	resv		: 2;
    uint32	pt			: 8;	// payload type
    uint32	port		: 16;	// rtp udp port
    char    rtpmap[64];			// a=rtpmap:96 ------ H264/90000
    char    encoder[32];		// H264	PCMA PS G729A
    uint32	hz;					// 采样频率
    uint32	chn;				// 通道数,  视频没有, 音频可能有, 默认是1
    uint32	ptime;				// 音频ptime,多少ms一个包
    uint32	bps;				// 带宽值，TIAS-bps，AS-kbps
    char    desc[256];			// a=fmtp:------
} SDPINFO;

typedef struct sua_session {
    mcp_udp_t mcp_udp;
    int uaf_rtp_mux	   : 1;		// 使用UDP-RTP端口复用模式，音频、视频RTP均采用同一复用ID，RTCP流的ID
    int uaf_v_tcp_rtp  : 1;		// 使用TCP-RTP模式传输视频
    UA_MEDIA        audio_rtp_media;			// 用来接收和发送音频的媒体结构
    UA_MEDIA        audio_rtcp_media;			// 用来接收和发送音频的媒体结构
    UA_MEDIA        video_rtp_media;			// 用来接收和发送视频的媒体结构
    UA_MEDIA        video_rtcp_media;			// 用来接收和发送视频的媒体结构
    UA_RTP_INFO     v_rtp_info;
    UA_RTP_INFO     a_rtp_info;
    uint32_t        uaf_playback    : 1;        // 录像回放标志
    MEDIA_INFO      media_info;                 // 媒体信息
    PSPKTI          pstxi;				        // PS组包发送信息
    void *          pstxi_mutex;                // mutex
    uint32_t        uaf_rtp_tx		: 1;        // RTP thread starts, is sending RTP
    PLAYCTX         play_ctx;				    // 当前播放上下文
    SDPINFO         r_v_sdp[MAX_AVN];			// 视频SDP描述信息解析结果
    SDPINFO         l_v_sdp[MAX_AVN];			// 本地视频SDP信息
} SUA;


#endif //MCP_MEDIA_H
